home *** CD-ROM | disk | FTP | other *** search
- 10 REM *** SIMPLOT by John Calder, Box 41-076, Auckland 3, NEW ZEALAND ***
- 11 REM *** phone 0064 - 9 - 828 2612 (Auckland 828 2612 or 3784160) ***
- 12 '
- 13 '*** 3rd Dec 1994 - own text processor routine lines 14000 on
- 14 '*** gives more friendly input. Also response to [Esc]
- 15 '
- 16 '*** 9th July, 1994 - tied in to new WPLOT programme via F10 key
- 17 '*** and COPY LINE is now on F9 rather than F7 for compatibility
- 22 '
- 24 '****** 30 May 1994 brings in more "open" equation editing
- 25 ' so students can now modify equations they typed in earlier.
- 26 ' Best with use of F9 key to repeat previously typed equation.
- 27 ' ALSO improved equation analysis to eliminate problem of stray
- 28 ' vertical lines. Ref use of GFLAG% in lines 5330 to 5395
- 29 '
- 30 REM
- 31 REM *** VERSION of 20th Feb 1993 features use of F2 to give ² symbol
- 32 REM *** and simplify and cleanup of F1 screens and response to entry
- 33 REM *** of 'y = ' . New plotting algorithm gives clearer lines where
- 34 REM *** gradient is steep, but has slowed down the plotting speed..
- 35 REM
- 40 REM *** VERSION of 7th January 1993 accepts input of the form ***
- 41 REM *** y = 5x etc without the need to specify "*" for multiplication ***
- 42 REM *** and uses my PowerBASIC programme PAGER.EXE for displaying ***
- 43 REM *** extended documentation ***
- 45 REM
- 50 REM *** VERSION of 5th October 1992 improved F-key behavior ***
- 70 DEFINT F-N
- 80 REM Reserve space for windows effect
- 90 DIM WGRSAVE%(12000), WCURSOR%(100), LENFIELD(25), DINPUT$(6, 25), DLINE$(24)
- 100 '
- 110 '*** Variable setup and guide
- 120 '*** SCREEN EDITing F KLINE (cursor line) COLOR
- 121 ' 1 19 10
- 122 ' 2 20 11
- 123 ' 3 21 12
- 124 ' 4 22 13
- 125 ' 5 23 14
- 126 ' 6 24 15
- 127 '
- 128 F = 1: KLINE = 19: INSFLAG = 1
- 145 FOR J = 1 TO 24: DLINE$(J) = " ": NEXT J
- 150 ON ERROR GOTO 160
- 155 SCREEN 9: EGAFLAG$ = "YES": PL% = &HFFFF: GOTO 180
- 160 SCREEN 2: EGAFLAG$ = "NO": PL% = &HF0F0: RESUME 180
- 180 KEY OFF
- 190 ON ERROR GOTO 6000
- 200 REM Set up function keys
- 210 KEY 1, " HELP" + CHR$(13)
- 220 IF EGAFLAG$ = "YES" THEN KEY 2, "²" ELSE KEY 2, "^2"
- 230 KEY 3, " Exit" + CHR$(13)
- 240 KEY 4, " GUIDE" + CHR$(13)
- 250 KEY 5, " Clear" + CHR$(13)
- 260 KEY 6, "^"
- 280 KEY 8, "~"
- 290 KEY 9, "|"
- 300 KEY 10, "DRAW" + CHR$(13)
- 5000 REM Set up limits for simplified graph
- 5015 CLS
- 5020 WINDOW (-6.9, -4.75)-(9.100001, 7.75)
- 5022 COLOR 15
- 5025 LINE (-6.9, 7.75)-(-6.7, 7.25), , BF
- 5030 GET (-6.9, 7.75)-(-6.7, 7.25), WCURSOR%
- 5040 COLOR 7: PRINT "Keys "; : COLOR 14: PRINT "F1";
- 5041 COLOR 7: PRINT "="; : COLOR 14: PRINT "H";
- 5042 COLOR 7: PRINT "ELP";
- 5050 COLOR 14: PRINT " F2";
- 5051 COLOR 7: PRINT "="; : COLOR 14: PRINT "²";
- 5060 COLOR 14: PRINT " F3";
- 5061 COLOR 7: PRINT "="; : COLOR 14: PRINT "E";
- 5062 COLOR 7: PRINT "XIT ";
- 5070 COLOR 14: PRINT " F4";
- 5071 COLOR 7: PRINT "="; : COLOR 14: PRINT "G";
- 5072 COLOR 7: PRINT "uide";
- 5080 COLOR 14: PRINT " F5";
- 5081 COLOR 7: PRINT "="; : COLOR 14: PRINT "C";
- 5082 COLOR 7: PRINT "LEAR";
- 5085 COLOR 14: PRINT " F6";
- 5087 COLOR 7: PRINT "=to the power of": PRINT
- 5090 COLOR 14: PRINT " F8"; : COLOR 7: PRINT "=clear line";
- 5092 COLOR 14: PRINT " F9"; : COLOR 7: PRINT "=copy line";
- 5095 COLOR 14: PRINT " F10"; : COLOR 7: PRINT "=draw-by-plot";
- 5098 '
- 5100 REM Set up grid lines
- 5105 COLOR 3
- 5110 FOR Y = -4 TO 7
- 5130 LINE (-6.9, Y)-(9.100001, Y), , , PL%
- 5140 NEXT Y
- 5150 FOR X = -6 TO 8
- 5160 LINE (X, -4.75)-(X, 7.75), , , PL%
- 5180 NEXT X
- 5190 REM
- 5200 REM start of graph drawing subroutine
- 5205 COLOR 11
- 5210 REM set up axes
- 5220 LINE (-6.9, 0)-(9.100001, 0)
- 5230 IF EGAFLAG$ = "YES" THEN LINE (0, -4.75)-(0, 7.75) ELSE LINE (0, -4.75)-(0, 7.75), , , &HFEFE
- 5250 REM Axes labels go here
- 5255 TEXTLINE = 0
- 5260 FOR YLABEL = 7 TO 1 STEP -1
- 5265 TEXTLINE = TEXTLINE + 2
- 5270 LOCATE TEXTLINE, 33: PRINT STR$(YLABEL)
- 5275 NEXT YLABEL
- 5290 LOCATE 16, 35: PRINT "0"
- 5300 COLUMN = 0
- 5301 FOR XLABEL = -6 TO -1
- 5302 COLUMN = COLUMN + 5
- 5303 LOCATE 16, COLUMN - 2: PRINT " " + STR$(XLABEL)
- 5304 NEXT XLABEL
- 5310 COLUMN = 34
- 5311 FOR XLABEL = 1 TO 8
- 5312 COLUMN = COLUMN + 5
- 5313 LOCATE 16, COLUMN: PRINT STR$(XLABEL)
- 5314 NEXT XLABEL
- 5320 FOR YLABEL = -1 TO -4 STEP -1
- 5322 TEXTLINE = 16 - 2 * YLABEL
- 5323 LOCATE TEXTLINE, 32: PRINT " "; STR$(YLABEL);
- 5324 NEXT YLABEL
- 5325 COLOR 11: LOCATE 17, 1: PRINT "GRAPHING OF EQUATIONS"
- 5326 COLOR 7: PRINT "Enter your equation below" ;
- 5327 LOCATE 25, 1: PRINT "[ INSERT active ]";
- 5328 FOR I = 1 TO 6: FOR J = 1 TO 25: DINPUT$(I, J) = " ": NEXT J: NEXT I
- 5329 GOTO 5400
- 5330 REM This is the bit that actually plots the function
- 5337 GFLAG% = 0
- 5340 FOR X = -6.9 TO 9.100001 STEP .025
- 5350 Y = FNF!(X)
- 5365 IF GFLAG% = 1 THEN 5380
- 5370 IF Y < -4.75 OR Y > 7.75 THEN 5390
- 5375 XPREV = X: YPREV = Y: GFLAG% = 1
- 5380 D = YPREV - Y: DD = 2 * D / 3
- 5384 LINE (X, Y)-(X, Y + DD)
- 5385 LINE (XPREV, YPREV)-(XPREV, YPREV - DD)
- 5387 XPREV = X: YPREV = Y
- 5390 NEXT X
- 5400 '********** start of main input routine *******************************
- 5410 KCOL = 6: LENFIELD(F) = 6
- 5420 GOSUB 14000
- 5428 IF HELPFLAG% = 1 THEN PUT (1.5,-3.75), WGRSAVE%, PSET: HELPFLAG% = 0
- 5458 '*** now for some answer analysis
- 5460 IF FUNCTION$ = "E" THEN 9000
- 5462 IF INSTR(FUNCTION$, "EXIT") > 0 THEN 9000
- 5466 IN3$ = LEFT$(FUNCTION$, 1)
- 5468 IF IN3$ = "H" THEN 8000
- 5470 IF INSTR(FUNCTION$, "HELP") > 0 THEN 8000
- 5472 IF FUNCTION$ = "C" THEN 5000
- 5474 IF INSTR(FUNCTION$, "CLEA") > 0 THEN 5000
- 5475 IF INSTR(FUNCTION$, "CGA") > 0 THEN SCREEN 2: EGAFLAG$ = "NO": PL% = &HF0F0: GOTO 180
- 5476 IF IN3$ = "G" OR INSTR(FUNCTION$, "GUID") > 0 THEN GOTO 9500
- 5480 IF IN3$ = "D" OR INSTR(FUNCTION$, "DRAW") > 0 THEN 5482 ELSE 5500
- 5482 LOCATE CSRLIN, 1: COLOR 15
- 5484 PRINT "**** loading DRAW-BY-PLOT programme ****": RUN "WPLOT"
- 5498 '
- 5500 OPEN "O", #1, "FUNCTION.BAS"
- 5510 F$ = "5550 " + "DEF FNF!(X) = " + FUNCTION$
- 5520 PRINT #1, F$
- 5530 CLOSE #1
- 5540 CHAIN MERGE "FUNCTION.BAS" ,5550,ALL
- 5550 DEF FNF!(X) = -X^50
- 5555 WINDOW (-6.9, -4.75)-(9.100001, 7.75)
- 5560 ON ERROR GOTO 6000
- 5565 GOTO 5330
- 5570 REM hard lesson learned on preserving variables 21/8/92
- 5571 REM in CHAIN MERGE filename,linenumber,ALL <-- is vital!
- 5572 REM
- 5800 '
- 6000 ' *** Sub for general errors
- 6005 IF ERL >= 5350 AND ERL < 5390 THEN RESUME 5390
- 6010 IF ERR = 5 THEN RESUME NEXT
- 6015 IF ERR = 70 THEN RESUME 6200
- 6020 PRINT : PRINT SPACE$(78): PRINT SPACE$(78)
- 6025 COLOR 15: BEEP
- 6030 PRINT "This programme has just 'crashed' due to some kind of ERROR"
- 6035 PRINT
- 6040 PRINT "This is probably not your fault, and the following information"
- 6045 PRINT "will help the writer, John Calder, make the programme better"
- 6050 PRINT
- 6055 PRINT "Please copy the following and contact John Calder, Box 41-076, Aucland 3"
- 6056 PRINT "Phone Auckland 8282612"
- 6057 PRINT
- 6060 PRINT "ERROR "; ERR; " at line "; ERL; TAB(40); "CL = "; CURSORLINE
- 6065 PRINT " y = "; FUNCTION$
- 6070 PRINT
- 6075 PRINT "Press Enter Key to return to menu and re-start from there"
- 6080 INPUT " ", ANYTHING$
- 6085 END 'SYSTEM
- 6090 '
- 6200 'Response to disk write-protected
- 6201 ' start with saving the screen graphics display and cursor position
- 6220 GET (1.5, 1.25)-(8.3, -3.75), WGRSAVE%
- 6230 LINE (1.5, 1.25)-(8.3, -3.75), 4, BF
- 6235 KLINE = CSRLIN: KCOL = POS(0)
- 6240 COLOR 12
- 6250 LOCATE 15, 44: PRINT " ERROR - disk 'write-protected' "
- 6252 LOCATE 16, 44: PRINT " "
- 6253 LOCATE 17, 44: PRINT " Please remove the disk and "
- 6254 LOCATE 18, 44: PRINT " slide the little cover over "
- 6255 LOCATE 19, 44: PRINT " the hole in the corner. "
- 6256 LOCATE 20, 44: PRINT " "
- 6257 LOCATE 21, 44: PRINT " Then put the disk back in and "
- 6258 LOCATE 22, 44: : PRINT " press ENTER key to continue... "
- 6260 AK$ = INKEY$: IF AK$ = "" THEN 6260
- 6270 PUT (1.5, 1.25), WGRSAVE%, PSET 'restore screen to its former glory
- 6275 COLOR CURSORLINE - 9
- 6280 LOCATE KLINE, KCOL: GOTO 5400
- 6300 '
- 7990 REM
- 8000 REM ****************** HELP routines *******************
- 8100 REM Create HELP window, start by saving graphics
- 8110 REM Area involved is TEXTLINES 14 to 23 COLS 47 to 78
- 8120 REM Corresponding SIMPLOT points are (1.5 , 1.25) - (8.3 , -3.75)
- 8200 REM start with saving the screen graphics display
- 8220 GET (1.5, 1.25)-(8.3, -3.75), WGRSAVE%
- 8230 LINE (1.5, 1.25)-(8.3, -3.75), 4, BF
- 8240 COLOR 14
- 8250 LOCATE 15, 44: PRINT " Equations type on 1 line only "
- 8252 LOCATE 16, 44: PRINT " "
- 8253 LOCATE 17, 44: PRINT " eg y = x becomes y = x/3 "
- 8254 LOCATE 18, 44: PRINT " 3 "
- 8255 LOCATE 19, 44: PRINT " and y = x to the power of 3 "
- 8256 LOCATE 20, 44: PRINT " becomes y = x^3 "
- 8257 LOCATE 21, 44: PRINT " "
- 8258 LOCATE 22, 44: : PRINT " press ENTER key to continue... "
- 8259 REM Use the graphics as a trick to draw a division line
- 8260 LINE (3.2, -.75)-(3.5, -.75)
- 8270 A$ = INKEY$: IF A$ = "" THEN 8270
- 8300 LOCATE 15, 44: PRINT " y = x is a good start "
- 8301 LOCATE 16, 44: PRINT " "
- 8302 LOCATE 17, 44: PRINT " explore y = x + 1 , y = x - 1 "
- 8303 LOCATE 18, 44: PRINT " y = -x , y = 0.5x "
- 8304 LOCATE 19, 44: PRINT " "
- 8305 LOCATE 20, 44: PRINT " y = x² starts a curve family "
- 8306 LOCATE 21, 44: PRINT " (use F2 key to get ² )"
- 8307 LOCATE 22, 44: PRINT " press ENTER key to continue... "
- 8310 A$ = INKEY$: IF A$ = "" THEN 8310
- 8320 REM I want this window to stay on-screen as
- 8325 REM student makes first attempts
- 8330 HELPFLAG% = 1
- 8335 LOCATE 22, 44: COLOR 15: PRINT " NOW ENTER YOUR EQUATION... "
- 8340 GOTO 5400
- 8700 REM *******SUBROUTINE for when students enter y = again *************
- 8702 REM start with saving the screen graphics display
- 8705 GET (1.5, 1.25)-(8.3, -3.75), WGRSAVE%
- 8707 LINE (1.5, 1.25)-(8.3, -3.75), 4, BF
- 8710 COLOR 14
- 8711 LOCATE 15, 44: PRINT " You need to make a correction.."
- 8712 LOCATE 16, 44: PRINT " "
- 8713 LOCATE 17, 44: PRINT " y = is already printed "
- 8714 LOCATE 18, 44: PRINT " on the screen for you. "
- 8715 LOCATE 19, 44: PRINT " You just need to enter "
- 8716 LOCATE 20, 44: PRINT " the x expression. "
- 8717 LOCATE 21, 44: PRINT " "
- 8718 LOCATE 22, 44: COLOR 15: PRINT "PRESS ANY KEY TO CONTINUE "
- 8740 A$ = INKEY$: IF A$ = "" THEN 8740
- 8750 HELPFLAG% = 1
- 8755 LOCATE 22, 44: : PRINT " NOW ENTER YOUR EQUATION... "
- 8760 GOTO 5400
- 8790 REM
- 8990 REM ************** END of HELP routines ****************
- 8995 REM
- 9000 REM ******* EXIT routine ***********
- 9110 CLS : SCREEN 1: COLOR , 2
- 9120 PRINT
- 9130 PRINT " EXITING from graphing programme."
- 9160 T1 = TIMER
- 9165 IF TIMER - T1 < 2 THEN 9165
- 9170 SCREEN 0: WIDTH 80: COLOR 7, 0
- 9200 SYSTEM
- 9210 '
- 9500 ' *** SUB FOR WORKSHEET
- 9510 SHELL "PAGER WKSHEET.TXT"
- 9520 SCREEN 9
- 9530 GOTO 5000
- 9540 '
- 9900 '
- 14000 REM ************ Start of screen input routine *****************
- 14460 KLINE = F + 18: C% = F + 9
- 14462 COLOR C%
- 14465 LOCATE KLINE, 1: PRINT " y = ";
- 14470 PUT (-6.9 + (KCOL - 1) * .2, 7.75 - KLINE * .5), WCURSOR%, XOR
- 14480 LOCATE KLINE, KCOL
- 14500 AK$ = INKEY$: IF AK$ = "" THEN 14500
- 14505 PUT (-6.9 + (KCOL - 1) * .2, 7.75 - KLINE * .5), WCURSOR%, XOR
- 14510 IA = ASC(AK$)
- 14520 IF IA = 27 THEN 9000: REM 27 is ESCape key *****************
- 14525 IF IA = 13 THEN 16000: REM input completed and checked on ENTER
- 14530 IF IA = 0 THEN 15000: REM arrow keys, insert, delete
- 14535 IF IA = 8 THEN 15500: REM Backspace key
- 14540 IF IA = 9 THEN F = F + 1: GOTO 14650: REM Tab key
- 14567 IF AK$ = "~" THEN 15950: REM F6 clear field line
- 14568 IF AK$ = "=" OR AK$ = "Y" THEN PRINT AK$: GOTO 8700
- 14569 IF AK$ = "|" THEN 16400 '*** F9 for copy line
- 14570 IF IA < 32 THEN 14000
- 14600 IF INSFLAG = 1 THEN GOSUB 15700: LOCATE KLINE, KCOL '*** insert procedure
- 14605 DINPUT$(F, KCOL) = AK$
- 14610 PRINT DINPUT$(F, KCOL);
- 14612 IF LENFIELD(F) < KCOL THEN LENFIELD(F) = KCOL
- 14615 KCOL = KCOL + 1
- 14620 IF KCOL > 24 THEN KCOL = 24
- 14640 REM **** return from subroutines handling tab and up/down arrow keys **
- 14650 IF F = 7 THEN F = 1
- 14660 IF F = 0 THEN F = 6
- 14760 GOTO 14000
- 14800 '**********
- 15000 REM ************** arrow and tab key analysis ********************
- 15003 IF ASC(RIGHT$(AK$, 1)) = 77 THEN 14615: REM Right Arrow
- 15010 IF ASC(RIGHT$(AK$, 1)) = 75 THEN 15200: REM Left Arrow
- 15020 IF ASC(RIGHT$(AK$, 1)) = 80 THEN 15300: REM Down Arrow
- 15030 IF ASC(RIGHT$(AK$, 1)) = 72 THEN 15400: REM Up Arrow
- 15040 IF ASC(RIGHT$(AK$, 1)) = 15 THEN 15400: REM Shift Tab
- 15050 IF ASC(RIGHT$(AK$, 1)) = 71 THEN KCOL = 6: GOTO 14470 '*** Home arrow
- 15060 IF ASC(RIGHT$(AK$, 1)) = 79 THEN 15800: REM END arrow
- 15070 IF ASC(RIGHT$(AK$, 1)) = 83 THEN 15550: REM Delete key
- 15080 IF ASC(RIGHT$(AK$, 1)) = 82 THEN 15600: REM Insert key procedure & flag
- 15200 REM ************* Left Arrow ****************
- 15205 IF KCOL > 6 THEN KCOL = KCOL - 1
- 15220 GOTO 14470
- 15300 REM ************* Down Arrow ****************
- 15310 F = F + 1
- 15320 GOTO 14650
- 15400 REM ************* Up Arrow or Shift Tab ****************
- 15410 F = F - 1
- 15420 GOTO 14650
- 15500 REM ************* Backspace Key - Delete comes in at 15550 *******
- 15510 IF KCOL = 6 THEN GOTO 14470
- 15515 KCOL = KCOL - 1
- 15520 LOCATE KLINE, KCOL
- 15550 FOR J = KCOL TO 24
- 15555 DINPUT$(F, J) = DINPUT$(F, J + 1): PRINT DINPUT$(F, J);
- 15560 NEXT J
- 15565 LENFIELD(F) = LENFIELD(F) - 1
- 15570 GOTO 14470
- 15600 REM **** Insert Key - main entry control flag and indicator ******
- 15610 IF INSFLAG = 1 THEN 15650
- 15615 INSFLAG = 1
- 15620 LOCATE 25, 1: PRINT "[ INSERT active ]";
- 15630 GOTO 14470
- 15650 INSFLAG = 0
- 15660 LOCATE 25, 1: COLOR 15: PRINT "[ insert OFF ]";
- 15670 GOTO 14470
- 15700 REM ***** Insert Key - text shift sub to ref from main sequence ***
- 15740 LFLAG = 0
- 15750 FOR J = 24 TO KCOL + 1 STEP -1
- 15755 DINPUT$(F, J) = DINPUT$(F, J - 1)
- 15756 IF DINPUT$(F, J) <> " " THEN LFLAG = 1
- 15757 LOCATE KLINE, J: PRINT DINPUT$(F, J);
- 15760 NEXT J
- 15770 IF LFLAG = 1 THEN LENFIELD(F) = LENFIELD(F) + 1
- 15780 'TTTTTTTT DINPUT$(F, 25) = " "
- 15790 RETURN '*** TO 14700
- 15800 REM ************* END Arrow ****************
- 15805 IF LENFIELD(F) > 23 THEN LENFIELD(F) = 23
- 15807 IF LENFIELD(F) < 6 THEN LENFIELD(F) = 6
- 15810 KCOL = LENFIELD(F) + 1
- 15820 GOTO 14470
- 15830 REM
- 15950 REM ************* CLEAR field line ****************
- 15960 FOR J = 6 TO 24: DINPUT$(F, J) = " ": NEXT J
- 15980 LOCATE KLINE, 5: PRINT SPACE$(20)
- 15985 LENFIELD(F) = 6
- 15995 GOTO 14460
- 16000 '******* finish this input routine by analysing the *****
- 16001 '******* individual DINPUT$ characters then assembling them *****
- 16002 '******* into FUNCTION$ via assembly process array DLINE$() *****
- 16020 FUNCTION$ = ""
- 16030 FOR I = 6 TO 24
- 16050 IF DINPUT$(F, I) = " " THEN 16150
- 16100 KCHR = ASC(DINPUT$(F, I))
- 16110 IF KCHR >= 97 AND KCHR <= 122 THEN KCHR = KCHR - 32
- 16120 DLINE$(I) = CHR$(KCHR)
- 16130 IF DLINE$(I) = "²" THEN DLINE$(I) = "^2"
- 16135 IF INSTR("XSCTAEL(", DLINE$(I)) <> 0 THEN GOSUB 16291
- 16140 FUNCTION$ = FUNCTION$ + DLINE$(I)
- 16150 NEXT I
- 16170 FPREV = F: F = F + 1: KCOL = 6: IF F = 7 THEN F = 1
- 16190 RETURN
- 16200 '
- 16290 REM **** SUBROUTINE FOR mx ---> m*x ********
- 16291 J = I - 1: IF J = 5 THEN RETURN
- 16292 IF DLINE$(J) = " " THEN 16293 ELSE 16294
- 16293 J = J - 1: IF J = 5 THEN RETURN ELSE 16292
- 16294 IF INSTR("1234567890)X", RIGHT$(DLINE$(J), 1)) = 0 THEN RETURN
- 16295 DLINE$(I) = "*" + DLINE$(I)
- 16296 RETURN
- 16300 '
- 16400 '******* SUBROUTINE for COPY LINE on F9 *****
- 16410 LOCATE KLINE, 6: PRINT SPACE$(19); : LOCATE KLINE, 6
- 16420 FOR I = 6 TO 24
- 16430 DINPUT$(F, I) = DINPUT$(FPREV, I): PRINT DINPUT$(F, I);
- 16440 NEXT I
- 16450 LENFIELD(F) = LENFIELD(FPREV)
- 16455 IF LENFIELD(F) > 23 THEN LENFIELD(F) = 23
- 16460 KCOL = LENFIELD(F) + 1
- 16470 GOTO 14470